iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
Mobile Development

少年K的Swift奇幻漂流記系列 第 8

Day8 Swift 基礎語法介紹 Part8

  • 分享至 

  • xImage
  •  

閉包(Closure)

閉包是 Swift 中一種字包含的函數或代碼區塊,可以在代碼中傳遞和使用,且能夠捕捉和儲存其作用範圍內的變量和常數。

基本語法

閉包的基本結構:

{ (參數) -> 回傳類型 in}
    //代碼區塊
}

簡單閉包

一個沒有參數和回傳值的閉包

let greet = {
    print("Hello, World!")
}
greet() //輸出 "Hello, World!"

參數閉包

閉包可以接受參數

let greetWithName = { (name: String) in
    print("Hello, \(name)!")
}
greetWithName("Alice") //輸出 "Hello, Alice!"

回傳值閉包

閉包可以回傳值

let addNumbers = { (a: Int, b: Int) -> Int in
    return a + b                 
}
let result = addNumbers(5, 3)
print(result) // 8

簡化閉包語法

Swift支援閉包的簡化寫法,如果閉包的型別已經確定,參數型別和回傳類型可以省略

let multiplyNumbers: (Int, Int) -> Int = { $0 * $1 }
let result = multiplyNumbers(4, 3)  // result 為 12

閉包作為參數傳遞

閉包常常被用來當作函數的參數,就像 Swift 函式庫裡的 sort 函數也是

let numbers = [5, 3, 8, 2, 9]
let sortedNumbers = numbers.sorted { $0 < $1 }
print(sortedNumbers) //輸出 [2, 3, 5, 8, 9]

逃逸閉包(@escaping)

當閉包在函數返回後才會執行時,稱為逃逸閉包。需要使用 @escaping 標記:

func performAsyncTask(completion: @escaping () -> void) {
    DispatchQueue.global().asyn {
        //模擬異步操作
        completion()
    }
}

捕獲值

閉包可以捕獲其外部的變量

func makeCounter() -> () -> Int {
    var count = 0
    return {
        count += 1
        return count
    }
}

let counter = makeCounter
print(counter()) // 輸出 1
print(counter()) // 輸出 2

閉包捕捉 count 並保存其狀態

結論

  1. 閉包是可以捕獲和儲存變量和常數的自包含代碼區塊。
  2. 閉包可以作為函數參數和返回值。
  3. Swift有簡化的閉包語法,可以使用參數位置符號 $0 等來簡化代碼但不常用到

上一篇
Day7 Swift 基礎語法介紹 Part7
下一篇
Day9 Swift 基礎語法介紹 Part9
系列文
少年K的Swift奇幻漂流記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言